package com.example.threadLocalLearning;

public class TL4 {

    private static final ThreadLocal<String> userContext = new ThreadLocal<>();

    /**
     * 封装操作:
     * 封装性强： 外部无法直接访问 userContext，只能通过接口操作。
     * 未来可拓展性高： 比如以后想加日志、权限控制、值校验、默认值处理，只需要修改方法内部即可，无需改动调用处。
     * 便于统一管理：代码中到处用 userContext.set(...) 会比较散乱，不易维护；封装之后只用 setUserContext(...)，非常清晰。
     * 避免误用 ThreadLocal API：比如忘记调用 remove() 等，封装后可以统一加 try-finally 自动处理。
     */

    public static void setUserContext(String user) {
        userContext.set(user);
    }

    public static String getUserContext() {
        return userContext.get();
    }

    public static void removeUserContext() {
        userContext.remove();
    }

    public static void main(String[] args) {
        new Thread(() -> {
            TL4.setUserContext("user1");
            System.out.println(Thread.currentThread().getName() + "=>" + TL4.getUserContext());
            TL4.removeUserContext();
        }).start();

        new Thread(() -> {
            TL4.setUserContext("user2");
            System.out.println(Thread.currentThread().getName() + "=>" + TL4.getUserContext());
            TL4.removeUserContext();
        }).start();
    }

}
